const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const session = require('express-session'); // 引入用于管理会话的中间件

// 创建Express应用实例
const app = express();

// 添加CORS中间件，解决跨域问题，这里可以配置得更灵活些，比如根据环境变量指定允许的源等
const corsOptions = {
    origin: function (origin, callback) {
        console.log('当前请求的源地址：', origin);
        const allowedOrigins = ['http://localhost:63342'];
        if (!origin || allowedOrigins.indexOf(origin)!== -1) {
            callback(null, true);
        } else {
            callback(new Error('Not allowed by CORS'));
        }
    },
    methods: ['GET', 'POST', 'PUT', 'DELETE'],
    allowedHeaders: ['Content-Type'],
    credentials: true // 修改为允许携带凭证，用于后续登录态维持
};
app.use(require('cors')(corsOptions));

// 使用body-parser中间件，解析JSON格式请求体数据
app.use(bodyParser.json());

// 配置Express-session中间件，用于管理用户会话（登录态）
app.use(session({
    secret: 'your_secret_key', // 替换为你自己的密钥，用于加密会话数据
    resave: false,
    saveUninitialized: false,
    cookie: {
        httpOnly: true,
        secure: false, // 如果是https环境，改为true
        maxAge: 3600000 // 会话有效期，单位毫秒，这里设置为1小时，可按需调整
    }
}));

// 配置MySQL数据库连接信息
const connection = mysql.createConnection({
    host: '127.0.0.1',
    port: 3307,
    user: 'root',
    password: '123456',
    database: 'testdb'
});

// 连接数据库，添加更完善的错误处理逻辑
connection.connect((err) => {
    if (err) {
        console.error('数据库连接失败：', err);
        process.exit(1); // 简单处理，直接退出进程，实际可优化为重试等逻辑
        return;
    }
    console.log('数据库连接成功');
});

// 定义公共的数据库操作错误处理函数
function handleDBError(res, err, operation) {
    console.error(`${operation}失败：`, err);
    res.status(500).json({ error: err.message });
    return;
}

// 1. 查询所有用户信息的路由
app.get('/users', (req, res) => {
    const sql = 'SELECT * FROM users';
    connection.query(sql, (err, results) => {
        if (err) {
            handleDBError(res, err, '查询用户信息');
            return;
        }
        console.log('成功查询到用户信息，结果数量：', results.length);
        res.json(results);
    });
});

// 2. 添加用户信息的路由（接收JSON格式数据）
app.post('/users', (req, res) => {
    const { name, age, password } = req.body;
    const sql = 'INSERT INTO users (name, age, password) VALUES (?,?,?)';
    connection.query(sql, [name, age, password], (err) => {
        if (err) {
            handleDBError(res, err, '添加用户信息');
            return;
        }
        console.log('用户信息添加成功');
        res.send('添加成功');
    });
});

// 3. 更新用户信息的路由（根据ID更新，假设前端传来的数据包含id字段及要更新的其他字段）
app.put('/users', (req, res) => {
    const { id, name, age } = req.body;
    const sql = 'UPDATE users SET name =?, age =? WHERE id =?';
    connection.query(sql, [name, age, id], (err) => {
        if (err) {
            handleDBError(res, err, '更新用户信息');
            return;
        }
        console.log('用户信息更新成功');
        res.send('更新成功');
    });
});

// 4. 删除用户信息的路由（根据ID删除）
app.delete('/users/:id', (req, res) => {
    const id = req.params.id;
    const sql = 'DELETE FROM users WHERE id =?';
    connection.query(sql, [id], (err) => {
        if (err) {
            handleDBError(res, err, '删除用户信息');
            return;
        }
        console.log('用户信息删除成功');
        res.send('删除成功');
    });
});

// 登录路由，验证用户名和密码，成功则设置会话表示登录态
app.post('/login', (req, res) => {
    const { name, password } = req.body;
    const sql = 'SELECT * FROM users WHERE name =?';
    connection.query(sql, [name], (err, results) => {
        if (err) {
            handleDBError(res, err, '登录查询用户信息');
            return;
        }
        if (results.length === 0) {
            res.status(401).json({ error: '用户名不存在' });
            return;
        }
        const user = results[0];
        if (user.password === password) {
            req.session.userId = user.id;
            res.json({ message: '登录成功' });
        } else {
            res.status(401).json({ error: '密码错误' });
        }
    });
});

// 登出路由，清除会话信息，实现登出功能
app.post('/logout', (req, res) => {
    req.session.destroy((err) => {
        if (err) {
            console.error('登出失败：', err);
            res.status(500).json({ error: err.message });
            return;
        }
        res.json({ message: '登出成功' });
    });
});

// 如果有根路由等通用路由需求，放在业务路由之后定义（这里简单示例返回一个提示信息）
app.get('/', (req, res) => {
    res.send('欢迎访问，这是管理系统首页');
});

// 启动服务器，监听端口（可自行指定，这里以3000为例）
const port = 3000;
app.listen(port, () => {
    console.log(`服务器启动，监听端口 ${port}`);
});